package cn.edu.gzgs.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

/**
 * 启动探测与前端地址输出组件。
 *
 * <p>应用启动完成后，尝试与前端地址建立连接以验证可达性，
 * 并在控制台打印可点击的前端访问 URL，便于快速打开。</p>
 *
 * <p>配置项：</p>
 * <ul>
 * 	<li>application.frontend.url：前端登录地址</li>
 * </ul>
 *
 * <p>命名规范：变量使用驼峰式命名法；常量使用全大写加下划线分隔；类名使用大驼峰命名法。</p>
 *
 * @author Zyf
 */
@Component
public class StartupFrontendRunner implements ApplicationRunner {

	private static final Logger log = LoggerFactory.getLogger(StartupFrontendRunner.class);

	private final RestTemplate restTemplate;

	@Value("${application.frontend.url}")
	private String frontendUrl;

	public StartupFrontendRunner(RestTemplate restTemplate) {
		this.restTemplate = restTemplate;
	}

	/**
	 * 应用启动后执行探测并输出前端 URL。
	 *
	 * 输入：
	 *  - args：应用启动参数（未使用）。
	 * 输出：
	 *  - 无返回值；在日志与控制台输出前端 URL 与连通性结果。
	 * 作用：
	 *  - 验证前端地址的可达性，并提供可点击链接以便快速访问。
	 */
	@Override
	public void run(ApplicationArguments args) {
		printFrontendUrl();
		probeFrontendConnectivity();
	}

	/**
	 * 打印前端 URL 到日志与标准输出，便于控制台点击。
	 */
	private void printFrontendUrl() {
		if (frontendUrl == null || frontendUrl.isBlank()) {
			log.warn("前端地址未配置：application.frontend.url");
			return;
		}

		// 日志输出
		log.info("前端地址：{}", frontendUrl);

		// 控制台输出（很多终端/IDE 控制台会将 URL 识别为可点击链接）
		System.out.println("[Workload-Management] 前端地址: " + frontendUrl);
	}

	/**
	 * 以轻量方式探测前端连通性。
	 *
	 * <p>优先使用 HEAD 请求；若失败则回退到 GET 请求，以最大化兼容性。</p>
	 */
	private void probeFrontendConnectivity() {
		if (frontendUrl == null || frontendUrl.isBlank()) {
			return;
		}

		try {
			// 尝试 HEAD 探测
			restTemplate.headForHeaders(frontendUrl);
			log.info("前端连通性检测成功（HEAD）：{}", frontendUrl);
			return;
		} catch (RestClientException ignored) {
			// 回退到 GET 探测
		}

		try {
			restTemplate.getForEntity(frontendUrl, String.class);
			log.info("前端连通性检测成功（GET）：{}", frontendUrl);
		} catch (RestClientException ex) {
			log.warn("前端连通性检测失败：{}，原因：{}", frontendUrl, ex.getMessage());
		}
	}
}


